import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import axios from 'axios'

// 配置全局axios
axios.defaults.baseURL = 'http://localhost:8000'

// 请求拦截器 - 添加token到请求头
axios.interceptors.request.use(config => {
    // 公开API列表，不需要添加认证头
    const publicApis = [
        '/api/users/companies/',
        '/api/users/login/',
        '/api/auth/login/',
        '/api/auth/refresh/'
        // 可以根据需要添加其他公开API
    ]

    // 检查当前请求是否匹配公开API
    const isPublicApi = publicApis.some(api => config.url.includes(api))

    // 只为非公开API添加认证头
    if (!isPublicApi) {
        const token = localStorage.getItem('token')
        if (token) {
            // 检查token格式，适配新的token格式
            // 如果token是JWT格式（包含两个点），直接使用Bearer前缀
            // 否则可能是旧格式，不添加Bearer前缀
            if (token.split('.').length === 3) {
                config.headers['Authorization'] = `Bearer ${token}`
            } else {
                config.headers['Authorization'] = token
            }
        }
    }

    // 确保请求头包含正确的Content-Type
    if (config.method === 'post' || config.method === 'put') {
        if (!config.headers['Content-Type'] && !(config.data instanceof FormData)) {
            config.headers['Content-Type'] = 'application/json';
        }
    }

    return config
}, error => {
    return Promise.reject(error)
})

// 响应拦截器 - 处理token过期和错误情况
axios.interceptors.response.use(response => {
    return response
}, async error => {
    // 获取原始请求配置
    const originalRequest = error.config

    // 检查是否是认证错误(401)
    if (error.response && error.response.status === 401) {
        // 公开API列表，即使返回401也不需要重定向
        const publicApis = [
            '/api/users/companies/',
            '/api/users/login/',
            '/api/auth/login/',
            '/api/auth/refresh/'
        ]

        // 检查当前请求是否匹配公开API
        const isPublicApi = publicApis.some(api => originalRequest.url.includes(api))

        // 如果不是公开API，才进行重定向
        if (!isPublicApi) {
            // 检查当前路径是否已经是登录页
            const currentPath = router.currentRoute.value.fullPath
            if (!currentPath.includes('/login')) {
                // 清除登录状态
                store.dispatch('logout')
                // 跳转到登录页，并带上原始请求的路径，便于登录后重定向
                router.push(`/login?redirect=${encodeURIComponent(currentPath)}`)
            }
        }
    }

    return Promise.reject(error)
})

const app = createApp(App)

// 注册所有Element Plus图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

// 全局属性
app.config.globalProperties.$axios = axios

app.use(router)
    .use(store)
    .use(ElementPlus)
    .mount('#app') 